package com.siwei.eqi.util;

import com.siwei.eqi.pojo.entity.GuangdongLandUse;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 生态用地面积比指数计算
 */
public class ElandCalculatorUtil {
    // 归一化系数
    private static final BigDecimal A_EL = new BigDecimal("100.5022");

    public static void main(String[] args) {
        GuangdongLandUse guangdongLandUse = new GuangdongLandUse();
        guangdongLandUse.setCountyArea(new BigDecimal(2132));
        BigDecimal bigDecimal = calculateEcologicalLandIndex(guangdongLandUse);
        System.out.println(bigDecimal);
    }

    public static BigDecimal calculateEcologicalLandIndex(GuangdongLandUse landUse) {
        // 分子计算（带权重的生态用地面积）
        BigDecimal numerator = BigDecimal.ZERO
                // 林地部分
                .add(safeGet(landUse.getForestedLand()))          // 有林地
                .add(safeGet(landUse.getShrubland()))             // 灌木林地
                .add(safeGet(landUse.getSparseForest()))          // 疏林地
                .add(safeGet(landUse.getOtherWoodland())          // 其他林地（权重0.7）
                        .multiply(new BigDecimal("0.7")))

                // 草地部分（三覆盖度草地求和）
                .add(safeGet(landUse.getHighCoverageGrassland())  // 高覆盖度草地
                        .add(safeGet(landUse.getMediumCoverageGrassland()))
                        .add(safeGet(landUse.getLowCoverageGrassland())))

                // 水域湿地部分
                .add(safeGet(landUse.getRiverArea()))             // 河流
                .add(safeGet(landUse.getLakeArea()))              // 湖泊
                .add(safeGet(landUse.getCoastalWaters()))         // 近海（海域）
                .add(safeGet(landUse.getTidalFlat()))   // 滩涂
                .add(safeGet(landUse.getPermanentGlacierSnow()))  // 永久冰川雪地
                .add(safeGet(landUse.getMarshland()))             // 沼泽地

                // 沙地
                .add(safeGet(landUse.getSandyLand()))             // 沙地

                // 带权重的耕地
                .add(safeGet(landUse.getPaddyField())             // 水田（权重0.7）
                        .multiply(new BigDecimal("0.7")))
                .add(safeGet(landUse.getDryFarmland())            // 旱地（权重0.5）
                        .multiply(new BigDecimal("0.5")))

                // 水库坑塘（权重0.7）
                .add(safeGet(landUse.getReservoirPondArea())
                        .multiply(new BigDecimal("0.7")));

        // 分母（县域总面积）
        BigDecimal la = safeGet(landUse.getCountyArea());

        // 计算指数：EL = (A_EL * numerator) / LA
        return A_EL.multiply(numerator)
                .divide(la, 6, RoundingMode.HALF_UP);  // 保留6位小数
    }

    // 安全获取BigDecimal值（处理null值）
    private static BigDecimal safeGet(BigDecimal value) {
        return value != null ? value : BigDecimal.ZERO;
    }

}
